#include<stdio.h>

/*
    1.文件 = 内容 + 属性

    2.磁盘寻址:
        盘面(磁头) -> 磁道 -> 扇区

    3.理解磁盘:(图1)
        将磁盘看做一个线性结构(数组), 线性结构的下标称为 LBA,
        通过一些算法可以通过 LBA 找到实际磁盘对应的地址(盘面, 磁道, 扇区)

    4.使用磁盘:
        (1) 磁盘分区(磁盘太大, 分区便于管理)
        (2) 磁盘格式化(写入文件系统)

    5.Linux 特有的 EXT 系列的文件系统:(图2)
        (1) 磁盘太大, 我们可以对其进行分区
        (2) Boot Block: 存放有每个分区有关启动的信息.
        (3) 对每个分区我们可以分成 N 个组, 对于每个组:
                super block: 存有该组的空间使用情况等信息, 与文件系统相关.
                Group Descriptor Table: 存放与该组相关的信息.
                Block Bitmap: 记录了 Data Block 中每个 Block 是否被使用.
                inode Bitmap: 记录了 inode Table 中每个 inode 是否被使用.
                inode Table: 存放文件的属性.里面有很多块, 一个块叫作一个 inode
                Data Block: 存放文件的内容, 里面会分成很多块, 每一个块叫作一个 block.

        注: 
            (1)Linux中, 是通过 inode 编号找到一个文件的, 通过 inode 我们可以找到文件对应的内容(block).
            (2)Block Bitmap 和 inode Bitmap 是一个位图结构, 它们记录了 inode 和 block 的使用情况.
            (3)位图:     00001010
                    从右到左: 
                        比特位的位置含义: inode 的编号
                        比特位的内容含义: 对应的 inode 是否被使用
                    (当我们新创建一个文件要申请新的inode和block时, 我们就可以遍历 Block Bitmap 和 inode Bitmap)

    6. 目录也是文件, 也有其 inode. 那目录里面放什么呢?
        文件名和inode编号的映射关系!!!( 文件名 : inode 编号 )

    7. 
       touch file.txt
       echo "hello world!" > file.txt
       cat file.txt
       rm file.txt
    请描述上述命令在系统层面都做了哪些工作?
    答: (1) 当我们创建文件时, 首先根据 inode Bitmap 申请空闲的 inode, 申请到后我们将 inode Bitmap 对应位置的比特位置1.
        (2) 在当前目录下, 建立文件名和 inode 的映射关系
        (3) 当我们向文件写入数据时, 根据数据大小和 Block Bitmap 申请 block, 并把 Block Bitmap 对应比特位置1, 
            然后再 inode 中记录该文件使用了哪些 block, 之后向block中写入数据.
        (4) 当我们要查看文件内容时, 根据目录中文件名和 inode 的映射关系找到文件的 inode, 通过 inode 找到对应的 block, 再将 block 里面的内容打印出来.
        (5) 通过文件名找到 inode, 之后把 inode Bitmap 和 Block Bitmap 中的对应比特位置 0(所以无论多大的文件删除时都很快)

*/
